import java.util.BitSet;


public class Table {
	Deck talia;
	private int zetony = 0;
	int stawka = 0;
	boolean check = true;
	boolean ALLin = false;
	
	Table(Player gracze[])
	{
		talia = new Deck();
		
		for(int i=0; i < 5; i++)
		{
			for(int y = 0; y < gracze.length; y++)
			{
				if(gracze[y] != null)
					pobierzKarte(gracze[y]);
			}
		}
	}
	
	public int getPula()
	{
		return zetony;
	}
	
	public void giveZetony(int zeto)
	{
		zetony = zeto;
	}
	
	public void oddajPuleWygr(Player gracz)
	{
		gracz.dajZetony(zetony);
		zetony = 0;
	}
	
	// jakim trybem nalezy wziac zetony od gracza, 0 - zwykly, 1 - wyrownanie, 2 - raise, 3 - allin, 4 - wpisowe
	public boolean wezZetony(Player gracz, int wartosc, int tryb)
	{
		if(ALLin == false)
		{
			if((tryb == 0 && check) || tryb == 1)
			{
				if(gracz.Zetony() < ((tryb == 0)?wartosc:stawka) || (wartosc <= 0 && tryb == 0)) return false;
				zetony += gracz.wezZetony(((tryb == 0)? wartosc: stawka));
				if(tryb == 0) stawka = wartosc;
				check = false;
				return true;
			}
			else if(tryb==2)
			{
				if(gracz.Zetony() < wartosc) return false;
				if(wartosc <= stawka) return false;
				stawka = wartosc;
				zetony += gracz.wezZetony(wartosc);
				return true;
			}
		}
		if(tryb == 3)
		{
			if(gracz.Zetony() == 0) return false;
			zetony += gracz.wezZetony(gracz.Zetony());
			ALLin = true;
			check = false;
			return true;
		}
		else if(tryb == 4)
		{
			if(gracz.Zetony() < wartosc) return false;
			zetony += gracz.wezZetony(wartosc);
			return true;
		}
		return false;
	}
	
	public int pobierzKarte(Player gracz) {
		if(gracz == null) return 0;
		Card karta = gracz.odbierzKarte(talia.wezZTalii());
		if(karta != null)
		{
			talia.wrzucDoTalii(karta);
			return 0;
		}
		return 1;
	}
	
	public boolean zamienKarte(Player gracz, int NrRek)
	{
		if(gracz == null) return false;
		//talia.wrzucDoTalii(gracz.reka[NrRek%5]);
		gracz.reka[NrRek%5] = null;
		pobierzKarte(gracz);
		return true;
	}
	
	/*public int porownajWszystGraczy(Player gracze[]) // przemy�lec
	{
		int wygrywajacyGracz=0;//
		boolean remis = false;
		
		for(int i=0; i < gracze.length-1; i++)
		{
			if(gracze[i] != null && gracze[i+1] != null)
			{
				if(gracze[i].porownajUklady(gracze[i+1]) == 1)
				{
					if(gracze[i].porownajUklady(gracze[wygrywajacyGracz]) == 1 && i != wygrywajacyGracz)
					{
						wygrywajacyGracz = i;
						remis = false;
					}
				}
				else if(gracze[i].porownajUklady(gracze[i+1]) == -1)
				{
					if(gracze[i+1].porownajUklady(gracze[wygrywajacyGracz]) == 1)
					{
						wygrywajacyGracz = i+1;
						remis = false;
					}
					else if(gracze[i+1].porownajUklady(gracze[wygrywajacyGracz]) == 0)
						remis = true;
				}
				else
				{
					wygrywajacyGracz = i;
					remis = true;
				}
				
			}
		}
		if(remis) wygrywajacyGracz = 5;
		return wygrywajacyGracz;
	}*/
	
	public BitSet compareAllPlayers(Player gracz[], BitSet moze_grac)
	{
		BitSet wygr = new BitSet(5);
		wygr.set(moze_grac.nextSetBit(0), 5);
		int wygrywajacy = moze_grac.nextSetBit(0);
		for(int i = wygrywajacy; i < gracz.length; i++)
		{
			if(gracz[i] == null || moze_grac.get(i) == false)
			{
				wygr.clear(i);
				continue;
			}
			if(gracz[wygrywajacy].porownajUklady(gracz[i]) == 1)
				wygr.clear(i);
			else if(gracz[wygrywajacy].porownajUklady(gracz[i]) == -1)
			{
				wygr.clear(wygrywajacy);
				wygrywajacy = i;
			}
		}
		if(wygr.length() > gracz.length)
		{
			wygr.clear(gracz.length, wygr.length());
		}
		return wygr;
	}
	
}
